package com.tian.service.impl;

import com.tian.message.SendEmailMessage;
import com.tian.service.SendEmailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

/**
 * {@code @description:} 发送带附近的邮件
 *
 * @author tianwc 公众号：Java后端技术全栈
 * 在线刷题 1200+java面试题和1000+篇技术文章：<a href="https://woaijava.cc/">博客地址</a>
 * {@code @date:} 2024-08-13 22:43
 * {@code @version:} 1.0
 */
@Slf4j
@Service("sendEmailAppendixMessageService")
public class SendEmail4AppendixServiceImpl implements SendEmailService {
    private final JavaMailSender javaMailSender;

    //邮件发送方邮箱
    @Value("${spring.mail.username}")
    private String MailSender;

    public SendEmail4AppendixServiceImpl(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    @Override
    public Boolean sendEmail(SendEmailMessage sendEmailMessage) {
        //1、获取MimeMessage对象，多用途的网际邮件扩充协议
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper mimeMessageHelper;

        try {
            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            //2、设置邮件发送方
            mimeMessageHelper.setFrom(MailSender);
            //3、设置邮件接收方
            mimeMessageHelper.setTo(sendEmailMessage.getRecipientEmail());
            //4、设置邮件主题
            mimeMessageHelper.setSubject(sendEmailMessage.getRecipientEmail());
            //5、设置邮件内容（第二个参数需要为true）
            mimeMessageHelper.setText(sendEmailMessage.getContent(), true);
            //附件内容
            for (String filePath : sendEmailMessage.getFilePathList()) {
                //FileSystemResource是Spring框架中的一个类,用来以URL或者File方式访问文件系统中的文件
                //通过FileSystemResource对象以File方式访问指定文件
                // public FileSystemResource(File file): filePath表示要访问的文件路径
                FileSystemResource file = new FileSystemResource(new File(filePath));

                //从给定的文件路径中提取出文件的文件名
//                FileSystemResource file = new FileSystemResource(new File("文件地址"));
//                String filename = file.getFilename(); // 获取附件名称
                // 例如：如果输入的文件路径“C:\folder\file.txt”，那么它将提取出文件名为“file.txt”。
                String fileName = file.getFilename();
                log.info("附件名称:" + fileName);
                //addAttachment()方法:添加附件到电子邮件中。它接收两个参数，
                // 第一个参数:文件的文件名，
                // 第二个参数:文件对象
                // 结合使用这两个参数，可以将一个或多个文件添加到电子邮件中
                mimeMessageHelper.addAttachment(fileName, file);
            }
            //6、发送文件
            javaMailSender.send(mimeMessage);
            log.info("带有附件的邮件发送成功");
            return true;
        } catch (MessagingException e) {
            log.error("sendAppendixMail 邮件发送失败：{}", e.getMessage());
            return false;
        }
    }
}
